Flutter Riverpod

Riverpod 是一个 Flutter 的响应式数据绑定框架,作者是 Provider 库的作者。Riverpod 是对 Provider 包的完全重写,以解决 Provider 的某些局限性,如类型安全、灵活性和可测试性。

许多人将 Riverpod 视为状态管理框架,但远不止如此。

优势:

背景:Why not Provider?

ProviderNotFoundException

Provider 依赖 InheritedWidget,依赖于 Flutter Widget Tree。导致 ProviderNotFoundException 问题:

BuildContext 带来复杂度

Provider 依赖 InheritedWidget,需要使用 BuildContext 进行组件树遍历。

这个过程与组件的生命周期相耦合,对使用者更加复杂,更加容易出错。

AutoDispose

Provider 提供了状态创建的过程,但框架本身对于状态释放销毁支持较弱。尤其是与组件生命周期自动关联。

Why Riverpod?

全局状态声明

程序状态与组件树解耦,作为全局声明。解决 ProviderNotFoundException 问题。

简化引用方式,变量引用,编译时语法检查,将复杂度,提升代码质量。

与 BuildContext 解耦

访问状态不需要 BuildContext。减少运行时出错可能性。

处理嵌套依赖

状态间嵌套引用时,依赖状态更新时,按照依赖关系进行响应。

AutoDispose

状态自动与组件生命周期关联。组件销毁时,为状态提供资源释放时机。

Hooks or not Hooks

RiverPod 提供有三个版本,在 Flutter 下有两个选择 flutter_hooksflutter_riverpod,带有 Hooks 功能的和不带的。如何选择呢?

它们的主要特点和差异,以帮助您做出选择:

flutter_hooks

flutter_riverpod

如何选择

同时使用

值得注意的是,您可以同时使用 flutter_hooksflutter_riverpod。例如,您可以使用 flutter_hooks 来管理组件的局部状态和生命周期,同时使用 flutter_riverpod 来管理应用的全局状态。这两者之间是兼容的,结合使用可以为您提供更强大和灵活的工具集。

基础概念

ProviderScope

ProviderScope 是一个 Widget,用于存储我们创建的所有提供程序的状态。

将整个 App 用 ProviderScope 包裹:

void main() {
  runApp(ProviderScope(
    child: MyApp(),
  ));
}

内部实现:ProviderScope 创建一个 ProviderContainer 实例。

Riverpod Provider

定义:为封装一些状态并允许侦听该状态的对象。

两个库的作者是同一个人。

选择 Provider 还是 Riverpod 主要取决于您的项目需求和您希望达到的目标。以下是一些考虑因素,可以帮助您做出决策:

  1. 类型安全:Riverpod 为状态管理提供了更强的类型安全。如果您希望系统在编译时捕获更多的错误并减少运行时的错误,Riverpod 可能更适合您。

  2. 灵活性:Riverpod 提供了多种 Provider 类型,如 StateProviderFutureProviderStreamProvider,让您更容易管理各种状态和数据流。同时,其 Provider 可以声明为全局的,这使得状态访问和组织更为灵活。

  3. 自动清理:Riverpod 提供了 .autoDispose 修饰符,允许在 Provider 不再被使用时自动清理资源。如果您的应用中有许多短暂的状态或需要管理资源生命周期,Riverpod 可能更有优势。

  4. 可测试性:Riverpod 设计时考虑到了可测试性,使得对状态逻辑的单元测试更为简单。

  5. 学习曲线:虽然 Riverpod 提供了许多先进的功能,但它的学习曲线可能比 Provider 更陡峭。如果您已经熟悉 Provider,并且不需要 Riverpod 提供的额外功能,那么继续使用 Provider 可能更为合适。

  6. 社区支持和生态系统:Provider 有着广泛的社区支持和丰富的插件生态。虽然 Riverpod 正在迅速增长,但其生态系统可能还不如 Provider 丰富。

  7. 项目已有架构:如果您的项目已经使用了 Provider 并且运行良好,那么除非您需要 Riverpod 的某些特定功能,否则可能没有必要迁移到 Riverpod。

总结:Riverpod 提供了一些 Provider 所不具备的高级功能,但也带来了更高的复杂性。您应根据项目的具体需求、团队的经验和目标来决定使用哪个工具。如果您追求更高的类型安全、灵活性和可测试性,Riverpod 可能是更好的选择。如果您希望快速上手或利用一个已有的生态系统,Provider 可能更合适。

2. 基本概念

3. 使用方法

  1. 声明 Provider:

    final helloWorldProvider = Provider<String>((ref) => 'Hello World');
    
  2. 消费 Provider:
    使用 Consumercontext.read 来消费上述 Provider。

    final greeting = context.read(helloWorldProvider);
    

4. StateProvider
一个简单的状态管理工具。例如,用于存储一个计数器的值。

final counterProvider = StateProvider<int>((ref) => 0);

使用 state 属性来读取或修改状态:

final counter = context.read(counterProvider).state;
context.read(counterProvider).state++;

5. FutureProvider 和 StreamProvider
用于处理异步数据。

final futureSampleProvider = FutureProvider<int>((ref) async {
  await Future.delayed(Duration(seconds: 1));
  return 42;
});

6. 依赖于其他 Provider
Providers 可以依赖于其他 Providers。当所依赖的 Provider 发生变化时,该 Provider 也会重新计算。

final someValueProvider = Provider<int>((ref) => 10);
final dependentProvider = Provider<int>((ref) {
  final someValue = ref.watch(someValueProvider);
  return someValue * 2;
});

7. AutoDispose
用于自动释放未使用的资源。

final autoDisposeProvider = Provider.autoDispose<String>((ref) => 'AutoDispose Sample');

Riverpod 2.0

Riverpod 的最新版本。

网络资源

Riverpodで状態管理 | Flutterで始めるアプリ開発 --- 使用 Riverpod 进行状态管理 | Flutter 应用程序开发入门 (flutter-study.dev)

【Flutter】Riverpod 入門 --- 【颤振】 开始使用 Riverpod (zenn.dev)

Flutter Riverpod 2.0: The Ultimate Guide (codewithandrea.com)推荐

riverpod_generator | Dart Package (pub.dev)

重走Flutter状态管理之路—Riverpod最终篇 (xuyisheng.top)

Flutter Riverpod Snippets - Visual Studio Marketplace

Flutter Riverpod Snippets - IntelliJ IDEs Plugin | Marketplace (jetbrains.com)


本文作者:Maeiee

本文链接:Flutter Riverpod

版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!


喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!